In this notebook, we create figures for Studies 1-4.

source("./scripts_general/dependencies.R")
source("./scripts_general/custom_funs.R")
source("./scripts_general/var_recode_contrast.R")
source("./study1/scripts_s1/s1_var_groups.R")
source("./study2/scripts_s2/s2_var_groups.R")
source("./study3/scripts_s3/s3_var_groups.R")
source("./study4/scripts_s4/s4_var_groups.R")
setwd("./study1/analysis/")
The working directory was changed to /Users/anthrouser/Documents/Projects/Mind and Spirit overview paper/mindspiritquant/study1/analysis inside a notebook chunk. The working directory will be reset when the chunk is finished running. Use the knitr root.dir option in the setup chunk to change the working directory for notebook chunks.
source("../../scripts_general/data_load.R")
Parsed with column specification:
cols(
  .default = col_double(),
  date = col_date(format = ""),
  researcher = col_character(),
  country = col_character(),
  site = col_character(),
  religion = col_character(),
  subject_gender = col_character(),
  subject_job = col_character(),
  subject_schedule = col_character(),
  subject_livedhere = col_character(),
  subject_lang = col_character(),
  subject_marital = col_character(),
  subject_hs = col_character(),
  subject_liveswith = col_character(),
  servicesperweek = col_character(),
  study = col_character()
)
See spec(...) for full column specifications.
Parsed with column specification:
cols(
  .default = col_double(),
  date = col_date(format = ""),
  researcher = col_character(),
  country = col_character(),
  quad = col_character(),
  subject_gender = col_character(),
  subject_job = col_character(),
  subject_schedule = col_character(),
  subject_livedhere = col_character(),
  subject_lang = col_character(),
  subject_marital = col_character(),
  subject_hs = col_character(),
  subject_school = col_character(),
  subject_liveswith = col_character(),
  servicesperweek = col_character(),
  godexpviaawe_freq = col_character(),
  sleephabit = col_character(),
  researcher_date = col_date(format = ""),
  researcher_notes = col_character(),
  site = col_character(),
  religion = col_character()
)
See spec(...) for full column specifications.
Parsed with column specification:
cols(
  .default = col_double(),
  ctry = col_character(),
  wher = col_character(),
  recr = col_character(),
  whoc = col_character(),
  demo_chur = col_character(),
  demo_ethn = col_character(),
  demo_maj = col_character(),
  demo_pocc = col_character(),
  demo_rlgn = col_character(),
  demo_sex = col_character()
)
See spec(...) for full column specifications.
Missing column names filled in: 'X1' [1]Parsed with column specification:
cols(
  .default = col_character(),
  X1 = col_double(),
  epi_subj = col_double(),
  epi_demo_age = col_double(),
  epi_demo_ses_num = col_double(),
  epi_demo_howr_num = col_double(),
  epi_demo_affr_num = col_double(),
  epi_demo_tung_num = col_double(),
  epi_demo_ytng_num = col_double(),
  epi_demo_affr_cat = col_logical(),
  epi_demo_tung_cat = col_logical(),
  epi_demo_ytng_cat = col_logical(),
  epi_version = col_double(),
  epi_charc = col_double()
)
See spec(...) for full column specifications.
2 parsing failures.
 row       col expected  actual                           file
1025 epi_charc a double Unclear '../../study3/data/d_demo.csv'
1027 epi_charc a double Unclear '../../study3/data/d_demo.csv'
Missing column names filled in: 'X1' [1]Parsed with column specification:
cols(
  X1 = col_double(),
  epi_ctry = col_character(),
  epi_subj = col_double(),
  score = col_double()
)
Joining, by = c("epi_ctry", "epi_subj")
Missing column names filled in: 'X1' [1]Parsed with column specification:
cols(
  X1 = col_double(),
  epi_ctry = col_character(),
  epi_subj = col_double(),
  score = col_double()
)
Joining, by = c("epi_ctry", "epi_subj")
Missing column names filled in: 'X1' [1]Parsed with column specification:
cols(
  X1 = col_double(),
  epi_ctry = col_character(),
  epi_subj = col_double(),
  question = col_character(),
  response = col_double(),
  order = col_double(),
  question_text = col_character()
)
Missing column names filled in: 'X1' [1]Parsed with column specification:
cols(
  X1 = col_double(),
  epi_ctry = col_character(),
  epi_subj = col_double(),
  question = col_character(),
  response = col_double(),
  order = col_double(),
  question_text = col_character()
)
Joining, by = c("epi_ctry", "epi_subj", "question", "response", "order", "question_text")
Joining, by = c("epi_ctry", "epi_subj")
Column `epi_ctry` joining character vector and factor, coercing into character vectorJoining, by = "epi_subj"
Missing column names filled in: 'X1' [1]Parsed with column specification:
cols(
  .default = col_double(),
  p7_ctry = col_character(),
  p7_abs_check = col_character(),
  p7_dse_check = col_character(),
  p7_se_check = col_character(),
  p7_unev_check = col_character(),
  p7_exsen_check = col_character(),
  p7_por_check = col_character(),
  p7_mm_check = col_character(),
  p7_dem_sex = col_character(),
  p7_dem_pocc = col_character(),
  p7_dem_major = col_character(),
  p7_dem_ethnicity = col_character(),
  p7_dem_rur.urb = col_character(),
  p7_dem_affrd.basics = col_character(),
  p7_dem_religion = col_character(),
  p7_dem_church = col_character(),
  p7_dem_holy.tung.gif = col_character(),
  p7_abs_child.exp_cat = col_logical(),
  p7_abs_poetic_cat = col_logical(),
  p7_abs_tv.real_cat = col_logical()
  # ... with 162 more columns
)
See spec(...) for full column specifications.
Joining, by = c("p7_ctry", "p7_subj", "question", "response", "scale")
Joining, by = c("p7_ctry", "p7_subj", "question", "response", "scale")
Joining, by = c("p7_ctry", "p7_subj", "question", "response", "scale")
Joining, by = c("p7_ctry", "p7_subj", "question", "response", "scale")
Joining, by = c("p7_ctry", "p7_subj", "question", "response", "scale")
Joining, by = c("p7_ctry", "p7_subj", "question", "response", "scale")
Joining, by = c("p7_ctry", "p7_subj", "question", "response", "scale")
Joining, by = c("p7_ctry", "p7_subj", "question", "response", "scale")
Joining, by = c("study", "p7_ctry", "p7_subj", "abs_score", "cog_score", "ctl_score", "dse_score", "hall_score", "para_score", "por_score", "pv_score", "spev_score")
Joining, by = c("study", "p7_ctry", "p7_subj", "abs_score", "cog_score", "ctl_score", "dse_score", "hall_score", "para_score", "por_score", "pv_score", "spev_score")

Summary statistics

Spiritual Events scores

Study 1

d1 %>%
  ggplot(aes(x = country, y = spirit_score, color = country, fill = country)) +
  geom_jitter(height = 0, width = 0.25, alpha = 0.2, show.legend = F ) +
  geom_pointrange(data = . %>%
                    group_by(country) %>%
                    summarise(mean = mean(spirit_score, na.rm = T),
                              sd = sd(spirit_score, na.rm = T)) %>%
                    ungroup(),
                  aes(y = mean, ymin = mean - sd, ymax = mean + sd),
                  shape = 23, color = "black",
                  show.legend = F) +
  scale_color_brewer(palette = "Dark2") +
  scale_fill_brewer(palette = "Dark2") +
  scale_y_continuous(limits = c(0, 1), breaks = seq(0, 1, 0.25)) +
  labs(x = "Country", y = "Study 1: Spiritual Events score (range: 0-1)",
       caption = "Error bars are ±1 standard deviation from the mean")

Study 2

d2 %>%
  ggplot(aes(x = country, y = spev_score, color = country, fill = country)) +
  geom_jitter(height = 0, width = 0.25, alpha = 0.2, show.legend = F ) +
  geom_pointrange(data = . %>%
                    group_by(country) %>%
                    summarise(mean = mean(spev_score, na.rm = T),
                              sd = sd(spev_score, na.rm = T)) %>%
                    ungroup(),
                  aes(y = mean, ymin = mean - sd, ymax = mean + sd),
                  shape = 23, color = "black",
                  show.legend = F) +
  scale_color_brewer(palette = "Dark2") +
  scale_fill_brewer(palette = "Dark2") +
  scale_y_continuous(limits = c(NA, 4), breaks = seq(0, 4, 1)) +
  labs(x = "Country", y = "Study 2: Spiritual Events score (range: 0-4)",
       caption = "Error bars are ±1 standard deviation from the mean")

Study 3

d3 %>%
  # correct for scaling in original dataset
  mutate(spirit_score = spirit_score * 4) %>%
  ggplot(aes(x = epi_ctry, y = spirit_score, color = epi_ctry, fill = epi_ctry)) +
  geom_jitter(height = 0, width = 0.25, alpha = 0.2, show.legend = F ) +
  geom_pointrange(data = . %>%
                    group_by(epi_ctry) %>%
                    summarise(mean = mean(spirit_score, na.rm = T),
                              sd = sd(spirit_score, na.rm = T)) %>%
                    ungroup(),
                  aes(y = mean, ymin = mean - sd, ymax = mean + sd),
                  shape = 23, color = "black",
                  show.legend = F) +
  scale_color_brewer(palette = "Dark2") +
  scale_fill_brewer(palette = "Dark2") +
  scale_y_continuous(limits = c(NA, 4), breaks = seq(0, 4, 1)) +
  labs(x = "Country", y = "Study 3: Spiritual Events score (range: 0-4)",
       caption = "Error bars are ±1 standard deviation from the mean")

Study 4

d4 %>%
  ggplot(aes(x = p7_ctry, y = spev_score, color = p7_ctry, fill = p7_ctry)) +
  geom_jitter(height = 0, width = 0.25, alpha = 0.2, show.legend = F ) +
  geom_pointrange(data = . %>%
                    group_by(p7_ctry) %>%
                    summarise(mean = mean(spev_score, na.rm = T),
                              sd = sd(spev_score, na.rm = T)) %>%
                    ungroup(),
                  aes(y = mean, ymin = mean - sd, ymax = mean + sd),
                  shape = 23, color = "black",
                  show.legend = F) +
  scale_color_brewer(palette = "Dark2") +
  scale_fill_brewer(palette = "Dark2") +
  scale_y_continuous(limits = c(NA, 4), breaks = seq(0, 4, 1)) +
  labs(x = "Country", y = "Study 4: Spiritual Events score (range: 0-4)",
       caption = "Error bars are ±1 standard deviation from the mean")

All studies

d_all <- d1 %>%
  select(study, country, site, religion, subject_id, 
         por_score, abs_score, spirit_score) %>%
  rename(spev_score = spirit_score,
         pv_score = por_score) %>%
  mutate(religion = recode_factor(religion,
                       "indigenous" = "Indigenous Religion",
                       "charismatic" = "Charismatic Christianity"),
         # rescale to 0-1
         pv_score = pv_score/3) %>%
  full_join(d2 %>% 
              select(study, country, subj, 
                     abs_score, spev_score, dse_score) %>% 
              rename(subject_id = subj) %>%
              # rescale to 0-1
              mutate(spev_score = spev_score/4,
                     dse_score = dse_score/5,
                     religion = "General Population")) %>%
  full_join(d3 %>% 
              select(study, epi_ctry, epi_sample, epi_subj, 
                     por_score, spirit_score) %>%
              rename(country = epi_ctry, 
                     religion = epi_sample,
                     subject_id = epi_subj,
                     spev_score = spirit_score) %>%
              mutate(religion = recode_factor(religion,
                "general population" = "General Population",
                "charismatic" = "Charismatic Christianity"))) %>%
  full_join(d4 %>%
              select(study, p7_ctry, p7_subj, 
                     por_score, pv_score, abs_score, spev_score, dse_score) %>%
              rename(country = p7_ctry,
                     subject_id = p7_subj) %>%
              # rescale to 0-1
              mutate(por_score = por_score/2,
                     pv_score = pv_score/3,
                     spev_score = spev_score/4,
                     dse_score = dse_score/5,
                     religion = "General Population")) %>%
  mutate(religion = factor(religion, 
                           levels = c("General Population", 
                                      "Indigenous Religion",
                                      "Charismatic Christianity")),
         study = gsub("study", "Study", study)) 
Joining, by = c("study", "country", "religion", "subject_id", "abs_score", "spev_score")
Column `religion` joining factor and character vector, coercing into character vectorJoining, by = c("study", "country", "religion", "subject_id", "spev_score")
Column `religion` joining character vector and factor, coercing into character vectorJoining, by = c("study", "country", "religion", "subject_id", "pv_score", "abs_score", "spev_score", "dse_score", "por_score")
d_all %>%
  ggplot(aes(x = country, y = spev_score, color = country, fill = country,
             group = study)) +
  geom_point(position = position_jitterdodge(jitter.width = 0.25,
                                   jitter.height = 0,
                                   dodge.width = 0.75), 
             alpha = 0.1) +
  geom_pointrange(data = d_spev %>%
                    group_by(study, country) %>%
                    summarise(mean = mean(spev_score, na.rm = T),
                              sd = sd(spev_score, na.rm = T)) %>%
                    ungroup(),
                  aes(y = mean, ymin = mean - sd, ymax = mean + sd, shape = study), 
                  position = position_dodge(width = 0.75),
                  color = "black") +
  scale_shape_manual(values = 21:24) +
  scale_color_brewer(palette = "Dark2") +
  scale_fill_brewer(palette = "Dark2") +
  guides(color = F, fill = F, 
         shape = guide_legend(override.aes = list(fill = "black"))) +
  theme(legend.position = "bottom") +
  labs(x = "Country", y = "Spiritual Events score (rescaled to 0-1)",
       shape = "Study", 
       caption = "Error bars are ±1 standard deviation from the mean")

d_spev_sum <- d_all %>%
  filter(!is.na(spev_score)) %>%
  group_by(study, country, religion) %>%
  summarise(mean = mean(spev_score, na.rm = T),
            sd = sd(spev_score, na.rm = T),
            n = n()) %>%
  ungroup()
d_all %>%
  ggplot(aes(x = country, y = spev_score, 
             color = country, fill = country,
             group = religion)) +
  facet_grid(~ study, scales = "free", space = "free") +
  geom_point(position = position_jitterdodge(jitter.width = 0.8,
                                    jitter.height = 0.02,
                                    dodge.width = 0.75), 
             alpha = 0.15) +
  geom_pointrange(data = d_spev_sum,
                  aes(y = mean, ymin = mean - sd, ymax = mean + sd, 
                      shape = religion), 
                  position = position_dodge(width = 0.75),
                  fill = "black",
                  color = "black") +
  geom_text(data = d_spev_sum %>%
              mutate(ypos = case_when(
                grepl("charismatic", tolower(religion)) ~ mean + sd + 0.05,
                TRUE ~ mean - sd - 0.05)),
            aes(y = ypos, label = paste0("n=", n)), 
            position = position_dodge(width = 0.75),
            size = 3, color = "black") +
  scale_shape_manual(values = 21:24) +
  scale_color_brewer(palette = "Dark2") +
  scale_fill_brewer(palette = "Dark2") +
  guides(color = F, fill = F, 
         shape = guide_legend(override.aes = list(fill = "black"))) +
  theme(legend.position = "bottom",
        axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1)) +
  labs(x = "Country", y = "Spiritual Events score (rescaled to 0-1)",
       # caption = "Error bars are ±1 standard deviation from the mean",
       shape = "Religion")

Relationships

All studies

d_all %>%
  gather(spirit_scale, spirit_score, c(spev_score, dse_score)) %>%
  gather(poros_scale, poros_score, c(por_score, pv_score)) %>%
  mutate(spirit_scale = recode_factor(spirit_scale,
                                      "spev_score" = "Spiritual Events",
                                      "dse_score" = "Daily Spiritual Experiences"),
         poros_scale = recode_factor(poros_scale,
                                     "pv_score" = "Porosity Vignettes",
                                     "por_score" = "Porosity Scale"),
         study_scale = paste(study, poros_scale, sep = ": ")) %>%
  filter(!is.na(poros_score)) %>%
  ggplot(aes(x = poros_score, y = spirit_score)) +
  facet_grid(spirit_scale ~ study_scale) +
  geom_point(data = . %>% distinct(study, study_scale, country, 
                            poros_scale, poros_score,
                            spirit_scale, spirit_score),
             aes(color = country), alpha = 0.1) +
  geom_smooth(aes(color = country), method = "lm", 
              lty = 2, size = 0.7, alpha = 0, show.legend = F) +
  geom_smooth(method = "lm", color = "black", alpha = 0.7) +
  scale_color_brewer(palette = "Dark2") +
  theme(legend.position = "bottom", 
        axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1)) +
  guides(color = guide_legend(override.aes = list(alpha = 1))) +
  labs(x = "Score on porosity measure (rescaled to 0-1)",
       y = "Score on spiritual experience measure (rescaled to 0-1)",
       # caption = "Solid black lines correspond to to the overall trend, collapsing across countries",
       color = "Country")

d_all %>%
  gather(spirit_scale, spirit_score, c(spev_score, dse_score)) %>%
  mutate(spirit_scale = recode_factor(spirit_scale,
                                      "spev_score" = "Spiritual Events",
                                      "dse_score" = "Daily Spiritual Experiences"),
         study_scale = paste(study, "Absorption scale", sep = ": ")) %>%
  filter(!is.na(abs_score)) %>%
  ggplot(aes(x = abs_score, y = spirit_score)) +
  facet_grid(spirit_scale ~ study_scale) +
  geom_point(data = . %>% distinct(study, study_scale, country, 
                            abs_score,
                            spirit_scale, spirit_score),
             aes(color = country), alpha = 0.2) +
  geom_smooth(aes(color = country), method = "lm", 
              lty = 2, size = 0.7, alpha = 0, show.legend = F) +
  geom_smooth(method = "lm", color = "black", alpha = 0.7) +
  scale_color_brewer(palette = "Dark2") +
  theme(legend.position = "bottom", 
        axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1)) +
  guides(color = guide_legend(override.aes = list(alpha = 1))) +
  labs(x = "Score on absorption measure (rescaled to 0-1)",
       y = "Score on spiritual experience measure (rescaled to 0-1)",
       # caption = "Solid black lines correspond to to the overall trend, collapsing across countries",
       color = "Country")

LS0tCnRpdGxlOiAiU3R1ZGllcyAxLTQ6IEZpZ3VyZXMiCnN1YnRpdGxlOiAiTHVocm1hbm4sIFdlaXNtYW4sIGV0IGFsLiIKb3V0cHV0OiAKICBodG1sX25vdGVib29rOgogICAgdGhlbWU6IGZsYXRseQogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6IHRydWUKLS0tCgpJbiB0aGlzIG5vdGVib29rLCB3ZSBjcmVhdGUgZmlndXJlcyBmb3IgU3R1ZGllcyAxLTQuCgpgYGB7cn0Kc291cmNlKCIuL3NjcmlwdHNfZ2VuZXJhbC9kZXBlbmRlbmNpZXMuUiIpCnNvdXJjZSgiLi9zY3JpcHRzX2dlbmVyYWwvY3VzdG9tX2Z1bnMuUiIpCnNvdXJjZSgiLi9zY3JpcHRzX2dlbmVyYWwvdmFyX3JlY29kZV9jb250cmFzdC5SIikKc291cmNlKCIuL3N0dWR5MS9zY3JpcHRzX3MxL3MxX3Zhcl9ncm91cHMuUiIpCnNvdXJjZSgiLi9zdHVkeTIvc2NyaXB0c19zMi9zMl92YXJfZ3JvdXBzLlIiKQpzb3VyY2UoIi4vc3R1ZHkzL3NjcmlwdHNfczMvczNfdmFyX2dyb3Vwcy5SIikKc291cmNlKCIuL3N0dWR5NC9zY3JpcHRzX3M0L3M0X3Zhcl9ncm91cHMuUiIpCmBgYAoKYGBge3J9CnNldHdkKCIuL3N0dWR5MS9hbmFseXNpcy8iKQpzb3VyY2UoIi4uLy4uL3NjcmlwdHNfZ2VuZXJhbC9kYXRhX2xvYWQuUiIpCmBgYAoKCiMgU3VtbWFyeSBzdGF0aXN0aWNzCgojIyBTcGlyaXR1YWwgRXZlbnRzIHNjb3JlcwoKIyMjIFN0dWR5IDEKCmBgYHtyfQpkMSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBjb3VudHJ5LCB5ID0gc3Bpcml0X3Njb3JlLCBjb2xvciA9IGNvdW50cnksIGZpbGwgPSBjb3VudHJ5KSkgKwogIGdlb21faml0dGVyKGhlaWdodCA9IDAsIHdpZHRoID0gMC4yNSwgYWxwaGEgPSAwLjIsIHNob3cubGVnZW5kID0gRiApICsKICBnZW9tX3BvaW50cmFuZ2UoZGF0YSA9IC4gJT4lCiAgICAgICAgICAgICAgICAgICAgZ3JvdXBfYnkoY291bnRyeSkgJT4lCiAgICAgICAgICAgICAgICAgICAgc3VtbWFyaXNlKG1lYW4gPSBtZWFuKHNwaXJpdF9zY29yZSwgbmEucm0gPSBUKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2QgPSBzZChzcGlyaXRfc2NvcmUsIG5hLnJtID0gVCkpICU+JQogICAgICAgICAgICAgICAgICAgIHVuZ3JvdXAoKSwKICAgICAgICAgICAgICAgICAgYWVzKHkgPSBtZWFuLCB5bWluID0gbWVhbiAtIHNkLCB5bWF4ID0gbWVhbiArIHNkKSwKICAgICAgICAgICAgICAgICAgc2hhcGUgPSAyMywgY29sb3IgPSAiYmxhY2siLAogICAgICAgICAgICAgICAgICBzaG93LmxlZ2VuZCA9IEYpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIpICsKICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIikgKwogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKDAsIDEpLCBicmVha3MgPSBzZXEoMCwgMSwgMC4yNSkpICsKICBsYWJzKHggPSAiQ291bnRyeSIsIHkgPSAiU3R1ZHkgMTogU3Bpcml0dWFsIEV2ZW50cyBzY29yZSAocmFuZ2U6IDAtMSkiLAogICAgICAgY2FwdGlvbiA9ICJFcnJvciBiYXJzIGFyZSDCsTEgc3RhbmRhcmQgZGV2aWF0aW9uIGZyb20gdGhlIG1lYW4iKQpgYGAKCiMjIyBTdHVkeSAyCgpgYGB7cn0KZDIgJT4lCiAgZ2dwbG90KGFlcyh4ID0gY291bnRyeSwgeSA9IHNwZXZfc2NvcmUsIGNvbG9yID0gY291bnRyeSwgZmlsbCA9IGNvdW50cnkpKSArCiAgZ2VvbV9qaXR0ZXIoaGVpZ2h0ID0gMCwgd2lkdGggPSAwLjI1LCBhbHBoYSA9IDAuMiwgc2hvdy5sZWdlbmQgPSBGICkgKwogIGdlb21fcG9pbnRyYW5nZShkYXRhID0gLiAlPiUKICAgICAgICAgICAgICAgICAgICBncm91cF9ieShjb3VudHJ5KSAlPiUKICAgICAgICAgICAgICAgICAgICBzdW1tYXJpc2UobWVhbiA9IG1lYW4oc3Bldl9zY29yZSwgbmEucm0gPSBUKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2QgPSBzZChzcGV2X3Njb3JlLCBuYS5ybSA9IFQpKSAlPiUKICAgICAgICAgICAgICAgICAgICB1bmdyb3VwKCksCiAgICAgICAgICAgICAgICAgIGFlcyh5ID0gbWVhbiwgeW1pbiA9IG1lYW4gLSBzZCwgeW1heCA9IG1lYW4gKyBzZCksCiAgICAgICAgICAgICAgICAgIHNoYXBlID0gMjMsIGNvbG9yID0gImJsYWNrIiwKICAgICAgICAgICAgICAgICAgc2hvdy5sZWdlbmQgPSBGKSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiKSArCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYyhOQSwgNCksIGJyZWFrcyA9IHNlcSgwLCA0LCAxKSkgKwogIGxhYnMoeCA9ICJDb3VudHJ5IiwgeSA9ICJTdHVkeSAyOiBTcGlyaXR1YWwgRXZlbnRzIHNjb3JlIChyYW5nZTogMC00KSIsCiAgICAgICBjYXB0aW9uID0gIkVycm9yIGJhcnMgYXJlIMKxMSBzdGFuZGFyZCBkZXZpYXRpb24gZnJvbSB0aGUgbWVhbiIpCmBgYAoKIyMjIFN0dWR5IDMKCmBgYHtyfQpkMyAlPiUKICAjIGNvcnJlY3QgZm9yIHNjYWxpbmcgaW4gb3JpZ2luYWwgZGF0YXNldAogIG11dGF0ZShzcGlyaXRfc2NvcmUgPSBzcGlyaXRfc2NvcmUgKiA0KSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBlcGlfY3RyeSwgeSA9IHNwaXJpdF9zY29yZSwgY29sb3IgPSBlcGlfY3RyeSwgZmlsbCA9IGVwaV9jdHJ5KSkgKwogIGdlb21faml0dGVyKGhlaWdodCA9IDAsIHdpZHRoID0gMC4yNSwgYWxwaGEgPSAwLjIsIHNob3cubGVnZW5kID0gRiApICsKICBnZW9tX3BvaW50cmFuZ2UoZGF0YSA9IC4gJT4lCiAgICAgICAgICAgICAgICAgICAgZ3JvdXBfYnkoZXBpX2N0cnkpICU+JQogICAgICAgICAgICAgICAgICAgIHN1bW1hcmlzZShtZWFuID0gbWVhbihzcGlyaXRfc2NvcmUsIG5hLnJtID0gVCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNkID0gc2Qoc3Bpcml0X3Njb3JlLCBuYS5ybSA9IFQpKSAlPiUKICAgICAgICAgICAgICAgICAgICB1bmdyb3VwKCksCiAgICAgICAgICAgICAgICAgIGFlcyh5ID0gbWVhbiwgeW1pbiA9IG1lYW4gLSBzZCwgeW1heCA9IG1lYW4gKyBzZCksCiAgICAgICAgICAgICAgICAgIHNoYXBlID0gMjMsIGNvbG9yID0gImJsYWNrIiwKICAgICAgICAgICAgICAgICAgc2hvdy5sZWdlbmQgPSBGKSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiKSArCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYyhOQSwgNCksIGJyZWFrcyA9IHNlcSgwLCA0LCAxKSkgKwogIGxhYnMoeCA9ICJDb3VudHJ5IiwgeSA9ICJTdHVkeSAzOiBTcGlyaXR1YWwgRXZlbnRzIHNjb3JlIChyYW5nZTogMC00KSIsCiAgICAgICBjYXB0aW9uID0gIkVycm9yIGJhcnMgYXJlIMKxMSBzdGFuZGFyZCBkZXZpYXRpb24gZnJvbSB0aGUgbWVhbiIpCmBgYAoKIyMjIFN0dWR5IDQKCmBgYHtyfQpkNCAlPiUKICBnZ3Bsb3QoYWVzKHggPSBwN19jdHJ5LCB5ID0gc3Bldl9zY29yZSwgY29sb3IgPSBwN19jdHJ5LCBmaWxsID0gcDdfY3RyeSkpICsKICBnZW9tX2ppdHRlcihoZWlnaHQgPSAwLCB3aWR0aCA9IDAuMjUsIGFscGhhID0gMC4yLCBzaG93LmxlZ2VuZCA9IEYgKSArCiAgZ2VvbV9wb2ludHJhbmdlKGRhdGEgPSAuICU+JQogICAgICAgICAgICAgICAgICAgIGdyb3VwX2J5KHA3X2N0cnkpICU+JQogICAgICAgICAgICAgICAgICAgIHN1bW1hcmlzZShtZWFuID0gbWVhbihzcGV2X3Njb3JlLCBuYS5ybSA9IFQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZCA9IHNkKHNwZXZfc2NvcmUsIG5hLnJtID0gVCkpICU+JQogICAgICAgICAgICAgICAgICAgIHVuZ3JvdXAoKSwKICAgICAgICAgICAgICAgICAgYWVzKHkgPSBtZWFuLCB5bWluID0gbWVhbiAtIHNkLCB5bWF4ID0gbWVhbiArIHNkKSwKICAgICAgICAgICAgICAgICAgc2hhcGUgPSAyMywgY29sb3IgPSAiYmxhY2siLAogICAgICAgICAgICAgICAgICBzaG93LmxlZ2VuZCA9IEYpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIpICsKICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIikgKwogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKE5BLCA0KSwgYnJlYWtzID0gc2VxKDAsIDQsIDEpKSArCiAgbGFicyh4ID0gIkNvdW50cnkiLCB5ID0gIlN0dWR5IDQ6IFNwaXJpdHVhbCBFdmVudHMgc2NvcmUgKHJhbmdlOiAwLTQpIiwKICAgICAgIGNhcHRpb24gPSAiRXJyb3IgYmFycyBhcmUgwrExIHN0YW5kYXJkIGRldmlhdGlvbiBmcm9tIHRoZSBtZWFuIikKYGBgCgojIyMgQWxsIHN0dWRpZXMKCmBgYHtyfQpkX2FsbCA8LSBkMSAlPiUKICBzZWxlY3Qoc3R1ZHksIGNvdW50cnksIHNpdGUsIHJlbGlnaW9uLCBzdWJqZWN0X2lkLCAKICAgICAgICAgcG9yX3Njb3JlLCBhYnNfc2NvcmUsIHNwaXJpdF9zY29yZSkgJT4lCiAgcmVuYW1lKHNwZXZfc2NvcmUgPSBzcGlyaXRfc2NvcmUsCiAgICAgICAgIHB2X3Njb3JlID0gcG9yX3Njb3JlKSAlPiUKICBtdXRhdGUocmVsaWdpb24gPSByZWNvZGVfZmFjdG9yKHJlbGlnaW9uLAogICAgICAgICAgICAgICAgICAgICAgICJpbmRpZ2Vub3VzIiA9ICJJbmRpZ2Vub3VzIFJlbGlnaW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAiY2hhcmlzbWF0aWMiID0gIkNoYXJpc21hdGljIENocmlzdGlhbml0eSIpLAogICAgICAgICAjIHJlc2NhbGUgdG8gMC0xCiAgICAgICAgIHB2X3Njb3JlID0gcHZfc2NvcmUvMykgJT4lCiAgZnVsbF9qb2luKGQyICU+JSAKICAgICAgICAgICAgICBzZWxlY3Qoc3R1ZHksIGNvdW50cnksIHN1YmosIAogICAgICAgICAgICAgICAgICAgICBhYnNfc2NvcmUsIHNwZXZfc2NvcmUsIGRzZV9zY29yZSkgJT4lIAogICAgICAgICAgICAgIHJlbmFtZShzdWJqZWN0X2lkID0gc3ViaikgJT4lCiAgICAgICAgICAgICAgIyByZXNjYWxlIHRvIDAtMQogICAgICAgICAgICAgIG11dGF0ZShzcGV2X3Njb3JlID0gc3Bldl9zY29yZS80LAogICAgICAgICAgICAgICAgICAgICBkc2Vfc2NvcmUgPSBkc2Vfc2NvcmUvNSwKICAgICAgICAgICAgICAgICAgICAgcmVsaWdpb24gPSAiR2VuZXJhbCBQb3B1bGF0aW9uIikpICU+JQogIGZ1bGxfam9pbihkMyAlPiUgCiAgICAgICAgICAgICAgc2VsZWN0KHN0dWR5LCBlcGlfY3RyeSwgZXBpX3NhbXBsZSwgZXBpX3N1YmosIAogICAgICAgICAgICAgICAgICAgICBwb3Jfc2NvcmUsIHNwaXJpdF9zY29yZSkgJT4lCiAgICAgICAgICAgICAgcmVuYW1lKGNvdW50cnkgPSBlcGlfY3RyeSwgCiAgICAgICAgICAgICAgICAgICAgIHJlbGlnaW9uID0gZXBpX3NhbXBsZSwKICAgICAgICAgICAgICAgICAgICAgc3ViamVjdF9pZCA9IGVwaV9zdWJqLAogICAgICAgICAgICAgICAgICAgICBzcGV2X3Njb3JlID0gc3Bpcml0X3Njb3JlKSAlPiUKICAgICAgICAgICAgICBtdXRhdGUocmVsaWdpb24gPSByZWNvZGVfZmFjdG9yKHJlbGlnaW9uLAogICAgICAgICAgICAgICAgImdlbmVyYWwgcG9wdWxhdGlvbiIgPSAiR2VuZXJhbCBQb3B1bGF0aW9uIiwKICAgICAgICAgICAgICAgICJjaGFyaXNtYXRpYyIgPSAiQ2hhcmlzbWF0aWMgQ2hyaXN0aWFuaXR5IikpKSAlPiUKICBmdWxsX2pvaW4oZDQgJT4lCiAgICAgICAgICAgICAgc2VsZWN0KHN0dWR5LCBwN19jdHJ5LCBwN19zdWJqLCAKICAgICAgICAgICAgICAgICAgICAgcG9yX3Njb3JlLCBwdl9zY29yZSwgYWJzX3Njb3JlLCBzcGV2X3Njb3JlLCBkc2Vfc2NvcmUpICU+JQogICAgICAgICAgICAgIHJlbmFtZShjb3VudHJ5ID0gcDdfY3RyeSwKICAgICAgICAgICAgICAgICAgICAgc3ViamVjdF9pZCA9IHA3X3N1YmopICU+JQogICAgICAgICAgICAgICMgcmVzY2FsZSB0byAwLTEKICAgICAgICAgICAgICBtdXRhdGUocG9yX3Njb3JlID0gcG9yX3Njb3JlLzIsCiAgICAgICAgICAgICAgICAgICAgIHB2X3Njb3JlID0gcHZfc2NvcmUvMywKICAgICAgICAgICAgICAgICAgICAgc3Bldl9zY29yZSA9IHNwZXZfc2NvcmUvNCwKICAgICAgICAgICAgICAgICAgICAgZHNlX3Njb3JlID0gZHNlX3Njb3JlLzUsCiAgICAgICAgICAgICAgICAgICAgIHJlbGlnaW9uID0gIkdlbmVyYWwgUG9wdWxhdGlvbiIpKSAlPiUKICBtdXRhdGUocmVsaWdpb24gPSBmYWN0b3IocmVsaWdpb24sIAogICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJHZW5lcmFsIFBvcHVsYXRpb24iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW5kaWdlbm91cyBSZWxpZ2lvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNoYXJpc21hdGljIENocmlzdGlhbml0eSIpKSwKICAgICAgICAgc3R1ZHkgPSBnc3ViKCJzdHVkeSIsICJTdHVkeSIsIHN0dWR5KSkgCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDMsIGZpZy5hc3AgPSAwLjh9CmRfYWxsICU+JQogIGdncGxvdChhZXMoeCA9IGNvdW50cnksIHkgPSBzcGV2X3Njb3JlLCBjb2xvciA9IGNvdW50cnksIGZpbGwgPSBjb3VudHJ5LAogICAgICAgICAgICAgZ3JvdXAgPSBzdHVkeSkpICsKICBnZW9tX3BvaW50KHBvc2l0aW9uID0gcG9zaXRpb25faml0dGVyZG9kZ2Uoaml0dGVyLndpZHRoID0gMC4yNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqaXR0ZXIuaGVpZ2h0ID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2RnZS53aWR0aCA9IDAuNzUpLCAKICAgICAgICAgICAgIGFscGhhID0gMC4xKSArCiAgZ2VvbV9wb2ludHJhbmdlKGRhdGEgPSBkX3NwZXYgJT4lCiAgICAgICAgICAgICAgICAgICAgZ3JvdXBfYnkoc3R1ZHksIGNvdW50cnkpICU+JQogICAgICAgICAgICAgICAgICAgIHN1bW1hcmlzZShtZWFuID0gbWVhbihzcGV2X3Njb3JlLCBuYS5ybSA9IFQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZCA9IHNkKHNwZXZfc2NvcmUsIG5hLnJtID0gVCkpICU+JQogICAgICAgICAgICAgICAgICAgIHVuZ3JvdXAoKSwKICAgICAgICAgICAgICAgICAgYWVzKHkgPSBtZWFuLCB5bWluID0gbWVhbiAtIHNkLCB5bWF4ID0gbWVhbiArIHNkLCBzaGFwZSA9IHN0dWR5KSwgCiAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjc1KSwKICAgICAgICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IDIxOjI0KSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiKSArCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIpICsKICBndWlkZXMoY29sb3IgPSBGLCBmaWxsID0gRiwgCiAgICAgICAgIHNoYXBlID0gZ3VpZGVfbGVnZW5kKG92ZXJyaWRlLmFlcyA9IGxpc3QoZmlsbCA9ICJibGFjayIpKSkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSArCiAgbGFicyh4ID0gIkNvdW50cnkiLCB5ID0gIlNwaXJpdHVhbCBFdmVudHMgc2NvcmUgKHJlc2NhbGVkIHRvIDAtMSkiLAogICAgICAgc2hhcGUgPSAiU3R1ZHkiLCAKICAgICAgIGNhcHRpb24gPSAiRXJyb3IgYmFycyBhcmUgwrExIHN0YW5kYXJkIGRldmlhdGlvbiBmcm9tIHRoZSBtZWFuIikKYGBgCgpgYGB7cn0KZF9zcGV2X3N1bSA8LSBkX2FsbCAlPiUKICBmaWx0ZXIoIWlzLm5hKHNwZXZfc2NvcmUpKSAlPiUKICBncm91cF9ieShzdHVkeSwgY291bnRyeSwgcmVsaWdpb24pICU+JQogIHN1bW1hcmlzZShtZWFuID0gbWVhbihzcGV2X3Njb3JlLCBuYS5ybSA9IFQpLAogICAgICAgICAgICBzZCA9IHNkKHNwZXZfc2NvcmUsIG5hLnJtID0gVCksCiAgICAgICAgICAgIG4gPSBuKCkpICU+JQogIHVuZ3JvdXAoKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA1LCBmaWcuYXNwID0gMC40NX0KZF9hbGwgJT4lCiAgZ2dwbG90KGFlcyh4ID0gY291bnRyeSwgeSA9IHNwZXZfc2NvcmUsIAogICAgICAgICAgICAgY29sb3IgPSBjb3VudHJ5LCBmaWxsID0gY291bnRyeSwKICAgICAgICAgICAgIGdyb3VwID0gcmVsaWdpb24pKSArCiAgZmFjZXRfZ3JpZCh+IHN0dWR5LCBzY2FsZXMgPSAiZnJlZSIsIHNwYWNlID0gImZyZWUiKSArCiAgZ2VvbV9wb2ludChwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcmRvZGdlKGppdHRlci53aWR0aCA9IDAuOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaml0dGVyLmhlaWdodCA9IDAuMDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvZGdlLndpZHRoID0gMC43NSksIAogICAgICAgICAgICAgYWxwaGEgPSAwLjE1KSArCiAgZ2VvbV9wb2ludHJhbmdlKGRhdGEgPSBkX3NwZXZfc3VtLAogICAgICAgICAgICAgICAgICBhZXMoeSA9IG1lYW4sIHltaW4gPSBtZWFuIC0gc2QsIHltYXggPSBtZWFuICsgc2QsIAogICAgICAgICAgICAgICAgICAgICAgc2hhcGUgPSByZWxpZ2lvbiksIAogICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC43NSksCiAgICAgICAgICAgICAgICAgIGZpbGwgPSAiYmxhY2siLAogICAgICAgICAgICAgICAgICBjb2xvciA9ICJibGFjayIpICsKICBnZW9tX3RleHQoZGF0YSA9IGRfc3Bldl9zdW0gJT4lCiAgICAgICAgICAgICAgbXV0YXRlKHlwb3MgPSBjYXNlX3doZW4oCiAgICAgICAgICAgICAgICBncmVwbCgiY2hhcmlzbWF0aWMiLCB0b2xvd2VyKHJlbGlnaW9uKSkgfiBtZWFuICsgc2QgKyAwLjA1LAogICAgICAgICAgICAgICAgVFJVRSB+IG1lYW4gLSBzZCAtIDAuMDUpKSwKICAgICAgICAgICAgYWVzKHkgPSB5cG9zLCBsYWJlbCA9IHBhc3RlMCgibj0iLCBuKSksIAogICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC43NSksCiAgICAgICAgICAgIHNpemUgPSAzLCBjb2xvciA9ICJibGFjayIpICsKICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gMjE6MjQpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIpICsKICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIikgKwogIGd1aWRlcyhjb2xvciA9IEYsIGZpbGwgPSBGLCAKICAgICAgICAgc2hhcGUgPSBndWlkZV9sZWdlbmQob3ZlcnJpZGUuYWVzID0gbGlzdChmaWxsID0gImJsYWNrIikpKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpKSArCiAgbGFicyh4ID0gIkNvdW50cnkiLCB5ID0gIlNwaXJpdHVhbCBFdmVudHMgc2NvcmUgKHJlc2NhbGVkIHRvIDAtMSkiLAogICAgICAgIyBjYXB0aW9uID0gIkVycm9yIGJhcnMgYXJlIMKxMSBzdGFuZGFyZCBkZXZpYXRpb24gZnJvbSB0aGUgbWVhbiIsCiAgICAgICBzaGFwZSA9ICJSZWxpZ2lvbiIpCmBgYAoKIyMgUmVsYXRpb25zaGlwcwoKIyMjICBBbGwgc3R1ZGllcwoKYGBge3IsIGZpZy53aWR0aCA9IDQsIGZpZy5hc3AgPSAwLjd9CmRfYWxsICU+JQogIGdhdGhlcihzcGlyaXRfc2NhbGUsIHNwaXJpdF9zY29yZSwgYyhzcGV2X3Njb3JlLCBkc2Vfc2NvcmUpKSAlPiUKICBnYXRoZXIocG9yb3Nfc2NhbGUsIHBvcm9zX3Njb3JlLCBjKHBvcl9zY29yZSwgcHZfc2NvcmUpKSAlPiUKICBtdXRhdGUoc3Bpcml0X3NjYWxlID0gcmVjb2RlX2ZhY3RvcihzcGlyaXRfc2NhbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNwZXZfc2NvcmUiID0gIlNwaXJpdHVhbCBFdmVudHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkc2Vfc2NvcmUiID0gIkRhaWx5IFNwaXJpdHVhbCBFeHBlcmllbmNlcyIpLAogICAgICAgICBwb3Jvc19zY2FsZSA9IHJlY29kZV9mYWN0b3IocG9yb3Nfc2NhbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHZfc2NvcmUiID0gIlBvcm9zaXR5IFZpZ25ldHRlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicG9yX3Njb3JlIiA9ICJQb3Jvc2l0eSBTY2FsZSIpLAogICAgICAgICBzdHVkeV9zY2FsZSA9IHBhc3RlKHN0dWR5LCBwb3Jvc19zY2FsZSwgc2VwID0gIjogIikpICU+JQogIGZpbHRlcighaXMubmEocG9yb3Nfc2NvcmUpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBwb3Jvc19zY29yZSwgeSA9IHNwaXJpdF9zY29yZSkpICsKICBmYWNldF9ncmlkKHNwaXJpdF9zY2FsZSB+IHN0dWR5X3NjYWxlKSArCiAgZ2VvbV9wb2ludChkYXRhID0gLiAlPiUgZGlzdGluY3Qoc3R1ZHksIHN0dWR5X3NjYWxlLCBjb3VudHJ5LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcm9zX3NjYWxlLCBwb3Jvc19zY29yZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwaXJpdF9zY2FsZSwgc3Bpcml0X3Njb3JlKSwKICAgICAgICAgICAgIGFlcyhjb2xvciA9IGNvdW50cnkpLCBhbHBoYSA9IDAuMSkgKwogIGdlb21fc21vb3RoKGFlcyhjb2xvciA9IGNvdW50cnkpLCBtZXRob2QgPSAibG0iLCAKICAgICAgICAgICAgICBsdHkgPSAyLCBzaXplID0gMC43LCBhbHBoYSA9IDAsIHNob3cubGVnZW5kID0gRikgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIGNvbG9yID0gImJsYWNrIiwgYWxwaGEgPSAwLjcpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwgCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpKSArCiAgZ3VpZGVzKGNvbG9yID0gZ3VpZGVfbGVnZW5kKG92ZXJyaWRlLmFlcyA9IGxpc3QoYWxwaGEgPSAxKSkpICsKICBsYWJzKHggPSAiU2NvcmUgb24gcG9yb3NpdHkgbWVhc3VyZSAocmVzY2FsZWQgdG8gMC0xKSIsCiAgICAgICB5ID0gIlNjb3JlIG9uIHNwaXJpdHVhbCBleHBlcmllbmNlIG1lYXN1cmUgKHJlc2NhbGVkIHRvIDAtMSkiLAogICAgICAgIyBjYXB0aW9uID0gIlNvbGlkIGJsYWNrIGxpbmVzIGNvcnJlc3BvbmQgdG8gdG8gdGhlIG92ZXJhbGwgdHJlbmQsIGNvbGxhcHNpbmcgYWNyb3NzIGNvdW50cmllcyIsCiAgICAgICBjb2xvciA9ICJDb3VudHJ5IikKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gMywgZmlnLmFzcCA9IDAuOX0KZF9hbGwgJT4lCiAgZ2F0aGVyKHNwaXJpdF9zY2FsZSwgc3Bpcml0X3Njb3JlLCBjKHNwZXZfc2NvcmUsIGRzZV9zY29yZSkpICU+JQogIG11dGF0ZShzcGlyaXRfc2NhbGUgPSByZWNvZGVfZmFjdG9yKHNwaXJpdF9zY2FsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3Bldl9zY29yZSIgPSAiU3Bpcml0dWFsIEV2ZW50cyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRzZV9zY29yZSIgPSAiRGFpbHkgU3Bpcml0dWFsIEV4cGVyaWVuY2VzIiksCiAgICAgICAgIHN0dWR5X3NjYWxlID0gcGFzdGUoc3R1ZHksICJBYnNvcnB0aW9uIHNjYWxlIiwgc2VwID0gIjogIikpICU+JQogIGZpbHRlcighaXMubmEoYWJzX3Njb3JlKSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gYWJzX3Njb3JlLCB5ID0gc3Bpcml0X3Njb3JlKSkgKwogIGZhY2V0X2dyaWQoc3Bpcml0X3NjYWxlIH4gc3R1ZHlfc2NhbGUpICsKICBnZW9tX3BvaW50KGRhdGEgPSAuICU+JSBkaXN0aW5jdChzdHVkeSwgc3R1ZHlfc2NhbGUsIGNvdW50cnksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJzX3Njb3JlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bpcml0X3NjYWxlLCBzcGlyaXRfc2NvcmUpLAogICAgICAgICAgICAgYWVzKGNvbG9yID0gY291bnRyeSksIGFscGhhID0gMC4yKSArCiAgZ2VvbV9zbW9vdGgoYWVzKGNvbG9yID0gY291bnRyeSksIG1ldGhvZCA9ICJsbSIsIAogICAgICAgICAgICAgIGx0eSA9IDIsIHNpemUgPSAwLjcsIGFscGhhID0gMCwgc2hvdy5sZWdlbmQgPSBGKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgY29sb3IgPSAiYmxhY2siLCBhbHBoYSA9IDAuNykgKwogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIikgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLCAKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSkpICsKICBndWlkZXMoY29sb3IgPSBndWlkZV9sZWdlbmQob3ZlcnJpZGUuYWVzID0gbGlzdChhbHBoYSA9IDEpKSkgKwogIGxhYnMoeCA9ICJTY29yZSBvbiBhYnNvcnB0aW9uIG1lYXN1cmUgKHJlc2NhbGVkIHRvIDAtMSkiLAogICAgICAgeSA9ICJTY29yZSBvbiBzcGlyaXR1YWwgZXhwZXJpZW5jZSBtZWFzdXJlIChyZXNjYWxlZCB0byAwLTEpIiwKICAgICAgICMgY2FwdGlvbiA9ICJTb2xpZCBibGFjayBsaW5lcyBjb3JyZXNwb25kIHRvIHRvIHRoZSBvdmVyYWxsIHRyZW5kLCBjb2xsYXBzaW5nIGFjcm9zcyBjb3VudHJpZXMiLAogICAgICAgY29sb3IgPSAiQ291bnRyeSIpCmBgYAoKCg==